home *** CD-ROM | disk | FTP | other *** search
/ Super PC 34 / Super PC 34 (Shareware).iso / spc / UTIL / DJGPP2 / V2 / DJLSR200.ZIP / src / libc / crt0 / c1loadef.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-01-25  |  3.2 KB  |  161 lines

  1. /* Copyright (C) 1996 DJ Delorie, see COPYING.DJ for details */
  2. /* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
  3. #include <libc/stubs.h>
  4. #include <crt0.h>
  5. #include <stdlib.h>
  6. #include <io.h>
  7. #include <fcntl.h>
  8. #include <string.h>
  9. #include <ctype.h>
  10. #include <unistd.h>
  11.  
  12. void
  13. __crt0_load_environment_file(char *app_name)
  14. {
  15.   int djgpp_env;
  16.   char *djgpp_var = getenv("DJGPP");
  17.  
  18.   if (djgpp_var)
  19.   {
  20.     djgpp_env = _open(djgpp_var, O_RDONLY);
  21.     if (djgpp_env >= 0)
  22.     {
  23.       char *file;
  24.       char base[120], *bp, *a0p, *tb;
  25.       int this_prog = 1;
  26.       int fsize = lseek(djgpp_env, 0L, SEEK_END);
  27.  
  28.       file = (char *)malloc(fsize+2);
  29.       if (file == 0)
  30.     return;
  31.       lseek(djgpp_env, 0L, 0);
  32.       _read(djgpp_env, file, fsize);
  33.       _close(djgpp_env);
  34.       if (file[fsize-1] == '\n')
  35.       {
  36.     file[fsize] = 0;
  37.       }
  38.       else
  39.       {
  40.     file[fsize] = '\n';
  41.     file[fsize+1] = 0;
  42.       }
  43.       tb = file;
  44.  
  45.       base[0] = '[';
  46.       bp = app_name;
  47.       for (a0p = bp; *a0p; a0p++)
  48.     if (strchr("\\/:", *a0p))
  49.       bp = a0p+1;
  50.       for (a0p=base+1; *bp && *bp != '.';)
  51.     *a0p++ = tolower(*bp++);
  52.       *a0p++ = ']';
  53.       *a0p++ = 0;
  54.  
  55.       bp = tb;
  56.       while (1)
  57.       {
  58.     tb = bp;
  59.     while (*tb && (*tb == '\n' || *tb == '\r'))
  60.       tb++;
  61.     bp = tb;
  62.     while (*bp && *bp != '\n' && *bp != '\r')
  63.       bp++;
  64.     if (*bp == 0)
  65.       break;
  66.     *bp++ = 0;
  67.     if (tb[0] == 0 || tb[0] == '#')
  68.       continue;
  69.     if (tb[0] == '[')
  70.     {
  71.       if (strcmp(tb, base) == 0)
  72.         this_prog = 1;
  73.       else
  74.         this_prog = 0;
  75.     }
  76.     else
  77.     {
  78.       if (this_prog)
  79.       {
  80.         char *buf = alloca(fsize);
  81.         char *tb2 = buf;
  82.         char *sp=tb, *dp=tb2;
  83.         while (*sp != '=')
  84.           *dp++ = *sp++;
  85.         if (*tb2 == '+')    /* non-overriding */
  86.         {
  87.           *dp = 0;
  88.           tb2++;
  89.           if (getenv(tb2))
  90.         continue;    /* while scanning bytes */
  91.         }
  92.         *dp++ = *sp++;    /* copy the '=' */
  93.         while (*sp)
  94.         {
  95.           if (*sp == '%')
  96.           {
  97.         char *pp;
  98.         if (sp[1] == '%')
  99.         {
  100.           *dp++ = '%';
  101.           sp += 2;
  102.         }
  103.         else
  104.         {
  105.           char ps, *e, *dirend;
  106.           int dirpart=0, apsemi=0;
  107.           int mapup=0, maplow=0, mapfs=0, mapbs=0;
  108.           while (strchr(":;/\\<>", sp[1]))
  109.           {
  110.             switch (sp[1])
  111.             {
  112.             case ':':  dirpart=1; break;
  113.             case ';':  apsemi=1;  break;
  114.             case '/':  mapfs=1;   break;
  115.             case '\\': mapbs=1;   break;
  116.             case '<':  mapup=1;   break;
  117.             case '>':  maplow=1;  break;
  118.             }
  119.             sp++;
  120.           }
  121.           for (pp=sp+1; *pp && *pp != '%'; pp++);
  122.           ps = *pp;
  123.           *pp = 0;
  124.           e = getenv(sp+1);
  125.           dirend = dp;
  126.           if (e)
  127.           {
  128.             while (*e)
  129.             {
  130.               char ec = *e++;
  131.               if (strchr("\\/:", ec))
  132.             dirend=dp;
  133.               if (mapup) ec = toupper(ec);
  134.               if (maplow) ec = tolower(ec);
  135.               if (mapfs && ec == '\\') ec = '/';
  136.               if (mapbs && ec == '/') ec = '\\';
  137.               *dp++ = ec;
  138.             }
  139.           }
  140.           if (dirpart)
  141.             dp = dirend;
  142.           if (apsemi && e)
  143.             *dp++ = ';';
  144.           if (ps == 0)
  145.             break;
  146.           sp = pp+1;
  147.         }
  148.           }
  149.           else
  150.         *dp++ = *sp++;
  151.         }
  152.         *dp++ = 0;
  153.         putenv(tb2);
  154.       }
  155.     }
  156.       }
  157.       free(file);
  158.     }
  159.   }
  160. }
  161.